#ifndef __DYNAMICARRAY_H_
#define __DYNAMICARRAY_H_


class DynamicArray
{
public:
    using ElementType = int;
    DynamicArray(); //无参构造

    void SetFreePtr(void (*FreePtr)(ElementType));

    DynamicArray(const DynamicArray& array); // 拷贝函数
    void operator=(const DynamicArray& array);  // 运算符重载

    ElementType* FindByIndex(int index);
    
    //返回值:存放下标的数组
    DynamicArray FindByElement(const ElementType& element);//查找

    void RemoveByIndex(ElementType index); // 按下标删除
    void RemoveByElement(ElementType element); //按元素删除

    //排序 : 递归深度
    void Sort();
    //去重算法:去除数列中的相同值，只留一个
    void Duplicate();

    //合并:合并两个有序数列
    //归并排序：双指针
    DynamicArray Merge(const DynamicArray& a);
    //找交集
    DynamicArray FindInterSection(const DynamicArray& array);
    //找并集
    DynamicArray FindUnionSet(const DynamicArray& array);
    //找补集
    DynamicArray FindDifference(const DynamicArray& array);
    
    bool operator==(const DynamicArray& array);

    //判断是不是一个子数列
    bool IsChild(const DynamicArray &array);

    //是否是连续子数列
    bool IsConChild(const DynamicArray& array);

    //获取一个子序列
    DynamicArray Subsquence(int index,int len);

    //修改
    //按位置修改
    void UpdateByIndex(int index,const ElementType& element);
    //按值修改
    void UpdateByElement(const ElementType& oldValue,const ElementType& newValue);

    void FastSort(int start,int end); //排序
    int BinarySearch(int element);  //二分
    ~DynamicArray();//析构函数


    //尾插法
    void InsertTail(const ElementType& element);
    //头插法
    void InsertHead(const ElementType& element);
    //中间插入
    void InsertByIndex(const ElementType &element,int index);



    

    void show();




private:
    void FastSort(int start,int end,int depth,int MaxDepth);
    void InsertSort(int start,int end);
    int Partition(int start,int end);
    ElementType* a;
    int capacity;
    int size;

    void (*FreePtr)(ElementType);
    void (*ShowPtr)(ElementType);
    void (*Compare)(ElementType);
};



#endif